/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.indicadores.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.indicadores.vo.PlanoMedicaoVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.DateFormat;

/**
 * Data Access Object da entidade PlanoMedicao do módulo de Indicadores. 
 * Essa classe é responsável por todas as operações de banco de dados
 * relacionadas à entidade.
 * 
 * @author Marcos Mello Nóbrega Soares ra 2013617/8
 */
public class PlanoMedicaoDAO extends BaseDAO<PlanoMedicaoVO> {

    @Override
    public void inserir(PlanoMedicaoVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TB_PlanoMedicao(NO_PlanoMedicao, DS_PlanoMedicao, DT_Criacao,");
        query.append("DT_Validade, ST_PlanoMedicaoAprovado, ST_PlanoMedicaoVigente) ");
        query.append("VALUES (?, ?, ?, ?, ?, ?)");

        List<?> parametros = criarParametros(entidade.getNoPlanoMedicao(),
                entidade.getDsPlanoMedicao(), entidade.getDtCriacao(),
                entidade.getDtValidade(), entidade.getStPlanoMedicaoAprovado(),
                entidade.getStPlanoMedicaoVigente());

        Integer idGerado = ((Long) executarInsercao(query.toString(),parametros)).intValue();

        entidade.setIdPlanoMedicao(idGerado);
    }

    @Override
    public void alterar(PlanoMedicaoVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TB_PlanoMedicao SET NO_PlanoMedicao = ?,");
        query.append("DS_PlanoMedicao = ?,");
        query.append("DT_Criacao = ?,");
        query.append("DT_Validade = ?,");
        query.append("ST_PlanoMedicaoAprovado = ?,");
        query.append("ST_PlanoMedicaoVigente = ?");
        query.append("WHERE ID_PlanoMedicao = ?");

        List<?> parametros = criarParametros(entidade.getNoPlanoMedicao(),
                entidade.getDsPlanoMedicao(), entidade.getDtCriacao(),
                entidade.getDtValidade(), entidade.getStPlanoMedicaoAprovado(),
                entidade.getStPlanoMedicaoVigente(), entidade.getIdPlanoMedicao());

        executarAlteracao(query.toString(), parametros);
    }

    @Override
    public void excluir(PlanoMedicaoVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TA_PlanoMedicaoObjetivo");
        query.append("WHERE CD_PlanoMedicao = ?;");

        executarAlteracao(query.toString(), criarParametros(entidade.getIdPlanoMedicao()));    
        
        query = new ConstrutorSQL();        
        
        query.append("DELETE FROM TB_PlanoMedicao");
        query.append("WHERE ID_PlanoMedicao = ?");

        executarAlteracao(query.toString(), criarParametros(entidade.getIdPlanoMedicao()));    
    }

    @Override
    public PlanoMedicaoVO consultarPorId(Serializable id) {

        PlanoMedicaoVO entidade = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_PlanoMedicao T WHERE T.ID_PlanoMedicao = ?");

        entidade = consultarUm(query.toString(), criarParametros(id));

        return entidade;
    }

    @Override
    public List<PlanoMedicaoVO> consultarPorExemplo(PlanoMedicaoVO exemplo) {

        List<PlanoMedicaoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_PlanoMedicao T WHERE 1=1");

        mapearQueryParaExemplo(query, exemplo);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }
    
    
     /**
     *  Retorna uma lista de planos de medição que tem data de validade não vencida
     * 
     * @param vigente inclui também o plano vigente
     * @return lista de planos
     */
    public List<PlanoMedicaoVO> consultarValidos(boolean vigente) {

        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '23:59:59'");
        
        List<PlanoMedicaoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_PlanoMedicao T WHERE DT_Validade IS NULL OR DT_Validade >= ?");
        
        if(!vigente)
            query.append("AND ST_PlanoMedicaoVigente <> \"S\"");
        
        List<?> parametros = criarParametros(sdf.format(new Date()));
            
        listaRetorno = consultar(query.toString(), parametros);

        return listaRetorno;
    }
    
    /**
     *  Retorna o plano de medição vigente
     * 
     * @return lista de planos
     */
    public PlanoMedicaoVO consultarPlanoVigente() {

        PlanoMedicaoVO entidade = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_PlanoMedicao T WHERE T.ST_PlanoMedicaoVigente = 'S'");

        entidade = consultarUm(query.toString(), null);

        return entidade;
    }


    @Override
    protected PlanoMedicaoVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        PlanoMedicaoVO entidade = new PlanoMedicaoVO();
        
        entidade.setIdPlanoMedicao(new Integer(rs.getInt("ID_PlanoMedicao")));        
        entidade.setNoPlanoMedicao(rs.getString("NO_PlanoMedicao"));
        entidade.setDsPlanoMedicao(rs.getString("DS_PlanoMedicao"));
        entidade.setDtCriacao(rs.getDate("DT_Criacao"));
        entidade.setDtValidade(rs.getDate("DT_Validade"));
        entidade.setStPlanoMedicaoAprovado(rs.getString("ST_PlanoMedicaoAprovado")); 
        entidade.setStPlanoMedicaoVigente(rs.getString("ST_PlanoMedicaoVigente")); 

        return entidade;
    }

    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, PlanoMedicaoVO exemplo) {

        if (exemplo.getNoPlanoMedicao() != null && !exemplo.getNoPlanoMedicao().isEmpty()) {
            query.append("AND T.NO_PlanoMedicao LIKE ?");
            adicionarParametro("%" + exemplo.getNoPlanoMedicao() + "%");
        }

        if (exemplo.getDsPlanoMedicao() != null && !exemplo.getDsPlanoMedicao().isEmpty()) {
            query.append("AND T.DS_PlanoMedicao LIKE ?");
            adicionarParametro("%" + exemplo.getDsPlanoMedicao() + "%");
        }
        
        if (exemplo.getDtCriacao() != null) {
            query.append("AND T.DT_Criacao = ?");
            adicionarParametro(exemplo.getDtCriacao());
        }
        
        if (exemplo.getDtValidade() != null) {
            query.append("AND T.DT_Validade = ?");
            adicionarParametro(exemplo.getDtValidade());
        }
        
        if (exemplo.getStPlanoMedicaoAprovado() != null) {
            query.append("AND T.ST_PlanoMedicaoAprovado = ?");
            adicionarParametro(exemplo.getStPlanoMedicaoAprovado());
        }
        
        if (exemplo.getStPlanoMedicaoVigente() != null) {
            query.append("AND T.ST_PlanoMedicaoVigente = ?");
            adicionarParametro(exemplo.getStPlanoMedicaoVigente());
        }
    }
}
